package log

import (
	"base/common/funs"
	"fmt"
	"github.com/golang-module/carbon/v2"
	"github.com/rifflock/lfshook"
	"github.com/sirupsen/logrus"
	"os"
	"runtime"
)

// 日志结构体
type LG struct {
	ph      string
	level   string
	message string
}

// 实例化 日志结构体
func New(lv, msg string) *LG {
	return &LG{
		message: msg,
		level:   lv,
	}
}

// 设置路径
func (l *LG) Path(path string) *LG {
	basePath, _ := os.Getwd()
	l.ph = fmt.Sprintf("%s/log/%s", basePath, path)
	return l
}

// 写入日志
func (l *LG) DiyLog(data any) {

	strData, err := funs.ToString(data)

	//获取调用文件得文件名与行号
	pc, _, _, _ := runtime.Caller(1)
	pcFunc := runtime.FuncForPC(pc)
	file, line := pcFunc.FileLine(pcFunc.Entry())
	errFile := fmt.Sprintf(file+":%d", line) // 报错文件

	logDir := fmt.Sprintf("%s/%s", l.ph, l.level)

	//获取字符串时间
	date := carbon.Now().ToDateString()

	// 创建日志文件钩子
	logFileHook := lfshook.NewHook(lfshook.PathMap{
		logrus.ErrorLevel: fmt.Sprintf("%s/%s.log", logDir, date),
		logrus.InfoLevel:  fmt.Sprintf("%s/%s.log", logDir, date),
	}, &logrus.JSONFormatter{})

	// 创建日志实例
	logger := logrus.New()
	//格式化时间
	logger.SetFormatter(&logrus.JSONFormatter{
		TimestampFormat: "2006-01-02 15:03:04",
	})
	// 添加日志文件钩子
	logger.AddHook(logFileHook)

	logData := map[string]any{
		"data": strData,
		"file": errFile,
	}

	// 如果日志转换数据存在错误
	if err != nil {
		logData["data"] = data
		logData["file"] = "logs"
		l.message = "日志方法转换文件错误"
	}

	// 写入 用户自定义字段
	log := logger.WithFields(logData)

	log.Error(l.message)

}

var EmptyLogData = map[string]any{}

// 写入错误日志
func ELog(err string, data map[string]any) {
	PLog(err, "error", data)
}

// 写入Inof 级日志
func ILog(err string, data map[string]any) {
	PLog(err, "info", data)
}

// Log 公用方法
func PLog(err, level string, data map[string]any) {

	//获取调用文件得文件名与行号
	_, file, line, _ := runtime.Caller(2)
	data["file"] = fmt.Sprintf(file+":%d", line)

	//获取路径
	basePath, e := os.Getwd()
	if e != nil {
		fmt.Printf("获取路径错误：%s", e)
		return
	}
	logDir := fmt.Sprintf("%s/log/%s", basePath, level)
	//获取字符串时间
	date := carbon.Now().ToDateString()

	// 创建日志文件钩子
	logFileHook := lfshook.NewHook(lfshook.PathMap{
		logrus.ErrorLevel: fmt.Sprintf("%s/%s.log", logDir, date),
		logrus.InfoLevel:  fmt.Sprintf("%s/%s.log", logDir, date),
	}, &logrus.JSONFormatter{})

	// 创建日志实例
	logger := logrus.New()
	//格式化时间
	logger.SetFormatter(&logrus.JSONFormatter{
		TimestampFormat: "2006-01-02 15:03:04",
	})
	// 添加日志文件钩子
	logger.AddHook(logFileHook)
	// 写入 用户自定义字段
	log := logger.WithFields(data)

	//根据级别判断
	switch level {
	case "info":
		log.Info(err)
		break
	case "error":
		log.Error(err)
		break
	}
}
